// use crate::List::{Cons, Nil};

// enum List<'a> {
//     Cons(i32, &'a List<'a>),
//     Nil,
// }

// fn main() {
//     let a = Cons(3, &Nil);
//     // let a = Cons(5, Box::new(Cons(10, Box::new(Nil))));
//     // let b = Cons(1, Box::new(a));
//     // let c = Cons(4, Box::new(a));
// }

/// # Rc<T>  引用计数智能指针   不可变引用
/// 一个值会有多个所有者，-多个引用
/// 没有引用时，可以清除该数据
/// 使用场景
/// 需要在heap（堆）上分配数据，这些数据被程序的多个部分读取（只读），但在编译时无法确定那个部分最后使用完这些数据
/// 只能用于单线程场景
/// 用法
/// 不在预导入模块中
/// Rc::clone(&a) 增加引用计数
/// Rc::strong_count(&a) 获得引用计数

/// 内部可变性：可变的借用一个不可变的值
/// 允许在只持有不可变引用的前提下，对数据进行修改
/// # RefCell<T>
/// 代表了其持有数据的唯一所有权
/// 只能用于单线程场景
/// 只能又一个数据的所有者
use crate::List::{Cons, Nil};
use std::rc::Rc;
enum List {
    Cons(i32, Rc<List>),
    Nil,
}

fn main() {
    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
    let b = Cons(1, Rc::clone(&a));
    let c = Cons(2, Rc::clone(&a));
    let mut aa = 32;
    let _anm = &aa;
    let _anm1 = &aa;
    let mut _am = &mut aa;
    let mut _am2 = &mut aa;
}

